Food Security Cluster Myanmar homepage


Summary of new achievements

Beneficiaries of humanitarian action formed 51% of the 49,950 beneficiaries in July 2022. The remainder were reached through development interventions.

In this report, when beneficiaries are mentioned, the Food Security Cluster is referring to unique beneficiaries or individuals. This is different from a beneficiary frequency which is an instance of a person receiving aid i.e. a person who receives food distributions, a crop, vegetable and seed kit and farmer training would be counted as three beneficiary frequencies, but as only one beneficiary.

As monthly reporting has just started, the volume of reporting is still lower than the pro-rated quarterly submissions. This means that several partners will hold off on reporting their achievements until the end of the quarter.


In terms of activities, farmer training and food distributions formed the bulk of the activities implemented in July. However, as mentioned earlier, these figure will be revised when new data comes in.



Overall, however, food distribution remains far and away the largest activity.



Food security interventions in July 2022 overwhelmingly targeted persons in host and local communities, this group forms 87.21% of all food distribution support, or 43,562 beneficiary frequencies (this includes if a person had been reached previously and are currently receiving their second or third round of assistance).




1. Geographies



1.1 States

A total of 3,267,194 beneficiaries were reached in July 2022.



Overall, these are year-to-date state-level breakdowns of beneficiaries reached:




July saw much fewer persons reached in Yangon than in previous months. It is hoped that the reallocation of resources out of the affluent urban core has been accelerated. It is also encouraging to see Magway receive the second-most support, after Rakhine.



1.2 Townships

A total of 132 townships have been reached across 16 states/regions as of 31st July 2022. In July alone, 52 townships were reached.

11,182 beneficiaries were reached in Magway township, this was 22% of the total.



When comparing the current footprint to that of the first quarter, the more activity was observed in Mandalay, Magway, Kayah and Kayin.



5 newly-reached townships were added in July 2022. They all in Shan South are are Laikha, Loilen, Mongnai, Mongpan and Nansang. All very traditionally remote and underserved areas.

Of the 2,544 sites reached, 421 had more than one partner present.



The food security cluster’s partners can mostly be found in Yangon, Rakhine and Kachin.





2. Activities

2.1 Progress by activity

The dotted red line shows the end of Q2 2022. The thick line in grey shows the progress in 2021 for the same activity. It should be noted that the 2021 progress lines are just a reference and not meant to be a direct comparison. The scope of the HRP was much different at the start of 2021 and the response only became nationwide in June; the FSC was also much smaller than it is now in 2022. Indeed, with the post-coup crisis affecting both humanitarian and development programming, the need for stronger coordination to adapt food food security programming has pushed many partners to enter the FSC. This type of comparison will be more useful next year.



In July 2022, progress primarily came from multi-purpose cash transfers, farmer training, food distributions and vocational training.



2.2 Agricultural and livelihoods activities

422,315 persons were reached through a combination of crop, vegetable and seed kits, FFS and farmer training, IGA and small grants and livestock kits.




2.3 Delivery modalities

Only HEB and fortified rice, community infrastructure and equipment and kitchen garden kits were delivered entirely through in-kind modalities.



There are also clear differences between the different beneficiary types and the delivery modalities employed with them. Beneficiaries from host/local communities largely received in-kind distributions whilst those from camps and IDP sites mostly received cash-based interventions, indicating that partners mostly worked in the same areas in Q1 and Q2.



Areas with the highest number of IDPs, such as Sagaing, Rakhine and Kachin, reach most of their beneficiaries through cash-based programming.





3. Cash-based programming

3.1 MMK per household

Compared to Q1, beneficiaries in Q2 are much less likely to have received cash transfers of less than USD 10 per household. The most common transfer values were between USD 60 and 70, an increase from the previous quarter.

In July 2022, the most common transfers values were between MMK 100,000 and MMK 200,000,



About 40% of beneficiaries of multi-purpose cash transfers in July 2022 were of quite high value.




3.2 MMK per person

The boxplots below shows the range of cash transfer values (all values are per person, to facilitate comparability) by activity. The average for reach activity is marked by the thick line in the middle of each box. The leftmost and rightmost side of each box indicate the 25th and 75th percentile of transfer values, respectively. The length of each box is a gauge for how much variation there is in the transfer values of each activity.

These plots use data for the entire year, instead of just July.



Each of the bubbles represents an individual intervention, with their position along the x-axis showing the USD per person value of the intervention and the size of each bubble indicating the number of beneficiaries reached.

Food distributions tended to have the tightest range of values, which proves that food assistance is quite standardised amongst partners.





3.3 Food distributions


Beneficiaries in Rakhine are split into two groups, one at around MMK 7,000 and another at MMK 17,000. Kayin has a very large number of persons who received less than MMK 1,000 each.

Distributions in Chin and Ayeyarwady had very consistent values as they were all implemented by the same implementing partner.

The table below compares the different bins for cash transfer values of food distributions with the minimum expenditure basket for food established by the Cash Working Group. They have established a floor of MMK 190,555 (or USD 114.55) for the food security component per household per month.

Overall, 1.86% of food distribution beneficiaries have received at least 100% of the food security MEB and 8.99% have received at least 50% of the food security MEB (MMK 19,056 or USD 11.45 per person).




3.4 Implementing partners

The plots below show the the average cash transfer values by activity for the top 7 partners implementing that activity. The x-axis shows the number of beneficiaries reached and the depth of the colour indicates the value of the cash transfer.





4. Partners

A total of 75 partners have reported into the Food Security Cluster as of July 2022 – there are 66 implementing partners and 28 reporting partners. This first instance of monthly reporting has seen a significant dip in submissions, but response has overall been better than expected.

All this means is that several partners are waiting until the end of the quarter to report in.

This section will mostly only look at year-to-date achievements.




4.1 Implementing partners

There are 16 partners that were involved in direct implementation that have reported achievements in July 2022, in comparison with 66 in the first quarter. These implementing partners corresponded to a total of 28 reporting organisations. The largest reporting organisation, 2690, had 24 implementing partners.

The interactive plot below shows the number of beneficiaries and townships reached by implementing partner.

14 partners (21% of the total) have a presence in more than 5 townships. 11 partners (16% of the total) are present in more than 10 townships.




4.2 Monthly progress by partner

The thick grey line shows an organisation’s progress from last year, which, as mentioned, cannot exactly be used for a straight comparison as the scope of the HRP in 2021 was different until the approval of the IERP, additionally, many partners only joined the cluster late in 2021 or even in 2022. Still, it serves as a reference.



The table below lists the top 15 partners by number of beneficiaries reached in 2022.




4.3 Donors

The table below summarises the reach and scope (in terms of geographic extent and number of organisations supported) of donors who support at least two reporting organisations.



Sagaing, Shan (East), Tanintharyi and Magway have the fewest number of donors present.



However, as shown by the table below, even though the majority of partners reported their donors, the omission of data from three key partners has resulted in the vast majority of reported beneficiaries not being associated with any donor.





5. Beneficiaries

87.21% of all beneficiaries in July 2022 were from host or local communities.





5.1 Beneficiary types

In July 2022, 87.21% of beneficiaries were from host or local communities, in comparison to 75.12% for the whole year. 12.18% of beneficiaries in July 2022 were IDPs, compared to 18.51% for the whole year.





6. Comparison with targets

6.1 Reached vs target by township

The specifics of each township can be reviewed with the interactive plot below. Each point is a township, with the size indicating the number of beneficiaries. The x-axis indicates the target population by township and the y-axis shows the number of beneficiaries reached, as of 31 July 2022.

The red line down the middle represents reaching 100% of the target. Townships above this line have reached more beneficiaries than their target and townships below the line have not met their target yet. The further away a township is from the red line, the further above or below its target it is. Mouse over each of the townships to see more details.

The 13 townships along the extreme left side of the plot have beneficiaries but do not have targets (their targets have just been coded as 1 so that they show up on the plot). 198 townships with targets have not been reached.



In most of the townships where the food security cluster is present, the number of beneficiaries reached is under the cluster target. Townships which have been heavily oversubscribed have been listed in the second quarter 5Ws report.



6.2 Map of beneficiaries reached in Q1 & Q2 2022 vs target




6.3 Interactive reference table

In the interactive table below, is a list of townships sorted by the gap between the targeted population and beneficiaries reached in 2022. Any of the columns can be sort; the search bars above each column can also assist in filtering.


LS0tDQp0aXRsZTogIlJlcG9ydCBvbiA1V3MiDQpzdWJ0aXRsZTogIkp1bHkgMjAyMiINCmF1dGhvcjogIk15YW5tYXIgRm9vZCBTZWN1cml0eSBDbHVzdGVyIg0KZGF0ZTogIjIwMjItMDktMDEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnZm9yY2UpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KIyByZXBsYWNlIA0Kb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCnN1bV9iZW4gPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIpew0KICANCiAgY29sdW1uX3ZhciA8LSBlbnF1byhjb2x1bW5fdmFyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpIA0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpIA0KICAgIA0KfQ0KDQojIHNjYWxpbmcgZnVuY3Rpb25zIA0KcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKX0NCnJhbmdlX3duYSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCwgbmEucm0gPSBUUlVFKSkvKG1heCh4LCBuYS5ybSA9IFRSVUUpLW1pbih4LCBuYS5ybSA9IFRSVUUpKX0NCg0KI21vZGUgZnVuY3Rpb24gDQptb2RlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdXggPC0gdW5pcXVlKHgpDQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0NCn0NCmBgYA0KDQoNCmBgYHtyIGRhdGF9DQoNCmZzYyA8LSByZWFkX2NzdigiLi9kYXRhL2ZzYy5jc3YiKSAlPiUgDQogIG11dGF0ZShqdWx5ID0gaWZlbHNlKG1vbnRoX29mX2ltcGxlbWVudGF0aW9uID09ICJKdWx5IDIwMjIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImp1bHkiLCAiamFuX3RvX2p1biIpKSANCg0KZnNjXzIwMjEgPC0gcmVhZF9jc3YoIi4vZGF0YS9mc2NfMjAyMS5jc3YiKQ0KDQpwaW4gPC0gcmVhZF9jc3YoIi4vZGF0YS9mc19waW4uY3N2IikNCg0KaGRfbGlzdCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQsIGFjdGl2aXR5X3JlZCkgJT4lDQogIG11dGF0ZShoZCA9IGlmZWxzZShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIgfA0KICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAiSHVtYW5pdGFyaWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAiRGV2ZWxvcG1lbnQiKSkgJT4lIA0KICBtdXRhdGUoaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID0gDQogICAgICAgICAgIGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIgJg0KICAgICAgICAgICAgICAgICAgICBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkRldmVsb3BtZW50IiwNCiAgICAgICAgICAgICAgICAgICJIdW1hbml0YXJpYW4iLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQpDQogICAgICAgICApICU+JQ0KICBncm91cF9ieShoZCkgJT4lIA0KICBzdW1tYXJpc2VfYXQoImJlbmVmaWNpYXJpZXMiLCBzdW0pICU+JQ0KICBtdXRhdGUocGMgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgdG93bnNoaXAgPSBUUywNCiAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpICU+JSANCiBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0cl9kZXRlY3QodG93bnNoaXAsICJIbGFpbmd0aGFyeWEiKSwgIk1NUjAxMzAwOCIsIGFkbWluM19wY29kZSkpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSkgJT4lIHN0X2FzX3NmKCkNCg0KYGBgDQoNCg0KW0Zvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIGhvbWVwYWdlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby8pDQoNCjxicj4NCg0KDQojIyBTdW1tYXJ5IG9mIG5ldyBhY2hpZXZlbWVudHMgIA0KDQpgYGB7ciBtYXBzLXRzcC1qdWwsIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMykgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoLjcsICJjbSIpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgIyBmaWx0ZXIocXVhcnRlciA9PSAicTIiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIGFzIG9mIDIwMjItMDctMzEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICANCg0KIyBnZ3NhdmUoIi4vbWFwc19xMV9xMi5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQoNCg0KYGBge3Igb3ZlcmFsbC1wYywgZXZhbD1GQUxTRX0NCmZpbHRlcihmc2MsIGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCA9PSAiSHVtYW5pdGFyaWFuIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gc3VtKHBpbiRmc190YXJnZXRlZCkNCg0Kcm91bmQoZmlsdGVyKGZzYywgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICogMTAwLCBkaWdpdHMgPSAyKQ0KYGBgDQoNCkJlbmVmaWNpYXJpZXMgb2YgaHVtYW5pdGFyaWFuIGFjdGlvbiBmb3JtZWQgYHIgcm91bmQoZmlsdGVyKGZzYywgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSBgciBmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgaW4gSnVseSAyMDIyLiBUaGUgcmVtYWluZGVyIHdlcmUgcmVhY2hlZCB0aHJvdWdoIGRldmVsb3BtZW50IGludGVydmVudGlvbnMuDQoNCkluIHRoaXMgcmVwb3J0LCB3aGVuIGJlbmVmaWNpYXJpZXMgYXJlIG1lbnRpb25lZCwgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBpcyByZWZlcnJpbmcgdG8gdW5pcXVlIGJlbmVmaWNpYXJpZXMgb3IgaW5kaXZpZHVhbHMuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBiZW5lZmljaWFyeSBmcmVxdWVuY3kgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBwZXJzb24gcmVjZWl2aW5nIGFpZCBpLmUuIGEgcGVyc29uIHdobyByZWNlaXZlcyBmb29kIGRpc3RyaWJ1dGlvbnMsIGEgY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdCBhbmQgZmFybWVyIHRyYWluaW5nIHdvdWxkIGJlIGNvdW50ZWQgYXMgdGhyZWUgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMsIGJ1dCBhcyBvbmx5IG9uZSBiZW5lZmljaWFyeS4gDQoNCkFzIG1vbnRobHkgcmVwb3J0aW5nIGhhcyBqdXN0IHN0YXJ0ZWQsIHRoZSB2b2x1bWUgb2YgcmVwb3J0aW5nIGlzIHN0aWxsIGxvd2VyIHRoYW4gdGhlIHByby1yYXRlZCBxdWFydGVybHkgc3VibWlzc2lvbnMuIFRoaXMgbWVhbnMgdGhhdCBzZXZlcmFsIHBhcnRuZXJzIHdpbGwgaG9sZCBvZmYgb24gcmVwb3J0aW5nIHRoZWlyIGFjaGlldmVtZW50cyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBxdWFydGVyLiANCg0KYGBge3J9DQpmc2MgJT4lICAgDQogIGdyb3VwX2J5KGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBuZXdfYmVuZWZpY2lhcmllcyA9IGlmZWxzZSgNCiAgICAgICAgICAgaXMubmEoYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKQ0KICAgICAgICAgKSwgDQogICAgICAgICBgJV9pbmNyZWFzZWAgPSByb3VuZCgoYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKSkgLyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcoYmVuZWZpY2lhcmllcykgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYXRlID0gZm9ybWF0KGFzLkRhdGUoZGF0ZSksICIlYiAlWSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBwZXIgbW9udGgiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjcpIA0KYGBgDQoNCjxicj4NCg0KSW4gdGVybXMgb2YgYWN0aXZpdGllcywgZmFybWVyIHRyYWluaW5nIGFuZCBmb29kIGRpc3RyaWJ1dGlvbnMgZm9ybWVkIHRoZSBidWxrIG9mIHRoZSBhY3Rpdml0aWVzIGltcGxlbWVudGVkIGluIEp1bHkuIEhvd2V2ZXIsIGFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGVzZSBmaWd1cmUgd2lsbCBiZSByZXZpc2VkIHdoZW4gbmV3IGRhdGEgY29tZXMgaW4uIA0KDQo8YnI+DQoNCg0KYGBge3IgYWN0aXZpdHktbGlzdH0NCmFjdGl2aXR5X2xpc3QgPC0gZnNjICU+JSANCiAgc3VtX2JlbjIocXVhcnRlciwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQpgYGANCg0KDQpgYGB7ciBiYXJwbG90LWFjdGl2aXR5fQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eSA9IGZjdF9yZW9yZGVyKGFjdGl2aXR5LCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICB5ID0gYWN0aXZpdHksIA0KICAgICAgICAgICAgIGZpbGwgPSBhY3Rpdml0eSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGluIEp1bHkgMjAyMiwgYnkgYWN0aXZpdHkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KYGBgDQoNCjxicj4NCg0KT3ZlcmFsbCwgaG93ZXZlciwgZm9vZCBkaXN0cmlidXRpb24gcmVtYWlucyBmYXIgYW5kIGF3YXkgdGhlIGxhcmdlc3QgYWN0aXZpdHkuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWFjdGl2aXR5fQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoanVseSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0ganVseSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwsIG5hLnJtID0gVFJVRSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY19qdWx5ID0gcm91bmQoanVseSAvIHN1bShqdWx5LCBuYS5ybSA9IFRSVUUpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JSANCiAgZmlsdGVyKHRvdGFsICE9IDApICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBzZWxlY3QoYWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgamFuX3RvX2p1biwganVseSwgDQogICAgICAgICBgJV9vZl9qdWx5YCA9IHBjX2p1bHksIA0KICAgICAgICAgdG90YWwsIA0KICAgICAgICAgYCVfb2ZfdG90YWxgID0gcGMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IGFjaXRpdml0eSwgYXMgb2YgMzEgSnVseSAyMDIyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLA0KICAgICAgICAgICAgICB3aWR0aCA9IC44NSkNCg0KDQpgYGANCg0KPGJyPg0KDQoNCmBgYHtyIGJlbi10eXBlLWxpc3R9DQpiZW5fdHlwZV9saXN0IDwtIGZzYyAlPiUNCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNCkZvb2Qgc2VjdXJpdHkgaW50ZXJ2ZW50aW9ucyBpbiBKdWx5IDIwMjIgb3ZlcndoZWxtaW5nbHkgdGFyZ2V0ZWQgcGVyc29ucyBpbiBob3N0IGFuZCBsb2NhbCBjb21tdW5pdGllcywgdGhpcyBncm91cCBmb3JtcyBgciBiZW5fdHlwZV9saXN0ICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiKSAlPiUgcHVsbChwYylgJSBvZiBhbGwgZm9vZCBkaXN0cmlidXRpb24gc3VwcG9ydCwgb3IgYHIgYmVuX3R5cGVfbGlzdCAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzICh0aGlzIGluY2x1ZGVzIGlmIGEgcGVyc29uIGhhZCBiZWVuIHJlYWNoZWQgcHJldmlvdXNseSBhbmQgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgdGhlaXIgc2Vjb25kIG9yIHRoaXJkIHJvdW5kIG9mIGFzc2lzdGFuY2UpLiANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4gR2VvZ3JhcGhpZXMNCg0KPGJyPjxicj4NCg0KIyMjIDEuMSBTdGF0ZXMNCg0KQSB0b3RhbCBvZiBgciBmb3JtYXQoc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcyksIGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgaW4gSnVseSAyMDIyLiANCg0KPGJyPg0KDQoNCmBgYHtyIHN0YXRlLWp1bHksIGZpZy5oZWlnaHQgPSA2fQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGZjdF9yZW9yZGVyKHN0YXRlLCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgeCA9IGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgIGZpbGwgPSBzdGF0ZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgbGFicyhmaWxsID0gIiIsIA0KICAgICAgIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHN0YXRlLCBvbmx5IEp1bHkgMjAyMiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCg0KPGJyPg0KDQpPdmVyYWxsLCB0aGVzZSBhcmUgeWVhci10by1kYXRlIHN0YXRlLWxldmVsIGJyZWFrZG93bnMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkOiANCg0KPGJyPg0KDQpgYGB7ciBzdGF0ZS15dGQsIGZpZy5oZWlnaHQgPSA2fQ0KDQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gZmN0X3Jlb3JkZXIoc3RhdGUsIGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICB4ID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgZmlsbCA9IHN0YXRlKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKGZpbGwgPSAiIiwgDQogICAgICAgeCA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgc3RhdGUsIGFzIG9mIDMxIEp1bHkgMjAyMiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KDQpgYGB7ciBzdGF0ZS1saXN0fQ0Kc3RhdGVfbGlzdCA8LSBmc2MgJT4lIA0KICBzdW1fYmVuMihzdGF0ZSwgcXVhcnRlcikgJT4lIA0KICBncm91cF9ieShxdWFydGVyKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KDQpgYGANCg0KDQpKdWx5IHNhdyBtdWNoIGZld2VyIHBlcnNvbnMgcmVhY2hlZCBpbiBZYW5nb24gdGhhbiBpbiBwcmV2aW91cyBtb250aHMuIEl0IGlzIGhvcGVkIHRoYXQgdGhlIHJlYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgb3V0IG9mIHRoZSBhZmZsdWVudCB1cmJhbiBjb3JlIGhhcyBiZWVuIGFjY2VsZXJhdGVkLiBJdCBpcyBhbHNvIGVuY291cmFnaW5nIHRvIHNlZSBNYWd3YXkgcmVjZWl2ZSB0aGUgc2Vjb25kLW1vc3Qgc3VwcG9ydCwgYWZ0ZXIgUmFraGluZS4gDQoNCmBgYHtyIGV2YWw9IEZBTFNFfQ0KZnNjICU+JSANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgVG93bnNoaXBzDQoNCkEgdG90YWwgb2YgYHIgZGlzdGluY3QoZnNjLCBhZG1pbjNfcGNvZGUpICU+JSBucm93KClgIHRvd25zaGlwcyBoYXZlIGJlZW4gcmVhY2hlZCBhY3Jvc3MgYHIgZGlzdGluY3QoZnNjLCBhZG1pbjFfcGNvZGUpICU+JSBucm93KClgIHN0YXRlcy9yZWdpb25zIGFzIG9mIDMxc3QgSnVseSAyMDIyLiBJbiBKdWx5IGFsb25lLCBgciBmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lIGRpc3RpbmN0KGFkbWluM19wY29kZSkgJT4lIG5yb3coKWAgdG93bnNoaXBzIHdlcmUgcmVhY2hlZC4gDQoNCmBgYHtyIHRvcC10b3duc2hpcHMtcGMsIGluY2x1ZGU9RkFMU0V9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDEyMDAwMCkgJT4lIA0KICB7c3VtKC4kcGMpfQ0KYGBgDQoNCjExLDE4MiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbiBNYWd3YXkgdG93bnNoaXAsIHRoaXMgd2FzIDIyJSBvZiB0aGUgdG90YWwuICANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS10b3AtdG93bnNoaXBzfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIHRvd25zaGlwLCBqdWx5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsIG5hbWVzX2Zyb20gPSBqdWx5LCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGNfanVseSA9IHJvdW5kKGp1bHkgLyBzdW0oanVseSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGNfanVseSkpICU+JSANCiAgaGVhZCgxMikgJT4lIA0KICAjIHN1bW1hcmlzZV9hdCgianVseSIsIHN1bSkNCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgDQogICAgICAgICBqYW5fdG9fanVuLCBqdWx5LCANCiAgICAgICAgIGAlX29mX2p1bHlgID0gcGNfanVseSwgDQogICAgICAgICB0b3RhbCwgDQogICAgICAgICBgJV9vZl90b3RhbGAgPSBwYykgJT4lDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oY2FwdGlvbiA9ICJUb3AgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgSnVseSAyMDIyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCANCiAgICAgICAgICAgaSA9IDEsIGogPSA0LA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgoIlRoZXNlIHRvcCAxMiB0b3duc2hpcHMgYXJlIHdoZXJlIDg2JSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbiBKdWx5IikpKQ0KDQojIGZzYyAlPiUgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgc3VtbWFyaXNlX2F0KCJuZXdfYmVuZWZpY2lhcmllcyIsIHN1bSkNCiAgDQpgYGANCg0KPGJyPg0KDQpXaGVuIGNvbXBhcmluZyB0aGUgY3VycmVudCBmb290cHJpbnQgdG8gdGhhdCBvZiB0aGUgZmlyc3QgcXVhcnRlciwgdGhlIG1vcmUgYWN0aXZpdHkgd2FzIG9ic2VydmVkIGluIE1hbmRhbGF5LCBNYWd3YXksIEtheWFoIGFuZCBLYXlpbi4gDQoNCg0KPGJyPg0KDQpgYGB7ciBtYXBzLWp1bHksIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMykgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoLjcsICJjbSIpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgbXV0YXRlKHBhcnRuZXJzID0gYXMuY2hhcmFjdGVyKHBhcnRuZXJzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IC4xKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4zKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIlBhcnRuZXJzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiUGFydG5lcnMiKSAgDQoNCiMgZ2dzYXZlKCIuL3Bsb3RzL21hcHNfanVsXzIwMjJfYmVuZWZpY2lhcmVpc19wYXJ0bmVycy5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwganVseSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCBuYW1lc19mcm9tID0ganVseSwgDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICBmaWx0ZXIoamFuX3RvX2p1biA9PSAwICYganVseSA+IDApICU+JSANCiAgY291bnQoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBzdW0obikpDQpgYGANCg0KNSBuZXdseS1yZWFjaGVkIHRvd25zaGlwcyB3ZXJlIGFkZGVkIGluIEp1bHkgMjAyMi4gVGhleSBhbGwgaW4gU2hhbiBTb3V0aCBhcmUgYXJlIExhaWtoYSwgTG9pbGVuLCBNb25nbmFpLCBNb25ncGFuIGFuZCBOYW5zYW5nLiBBbGwgdmVyeSB0cmFkaXRpb25hbGx5IHJlbW90ZSBhbmQgdW5kZXJzZXJ2ZWQgYXJlYXMuIA0KDQpPZiB0aGUgYHIgZnNjICU+JSBjb3VudChzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uKSAlPiUgbnJvdygpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBzaXRlcyByZWFjaGVkLCA0MjEgaGFkIG1vcmUgdGhhbiBvbmUgcGFydG5lciBwcmVzZW50LiAgDQoNCjxicj4NCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gIjFfcGFydG5lciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIjJfcGFydG5lcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9ICIzX3BhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSAiNF9wYXJ0bmVycyIpKSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZV9hdCgibG9jYXRpb24iLCBuX2Rpc3RpbmN0KSAlPiUgIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJOdW1iZXIgb2YgcGFydG5lcnMgYnkgbG9jYXRpb24sIGFzIG9mIDMxIEp1bHkgMjAyMiIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgDQpgYGANCg0KDQo8YnI+DQoNClRoZSBmb29kIHNlY3VyaXR5IGNsdXN0ZXIncyBwYXJ0bmVycyBjYW4gbW9zdGx5IGJlIGZvdW5kIGluIFlhbmdvbiwgUmFraGluZSBhbmQgS2FjaGluLg0KDQo8YnI+DQoNCmBgYHtyIGxvY2F0aW9ucy1wYXJ0bmVycy1zdGF0ZX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSkgJT4lDQogIGZpbHRlcihsb2NhdGlvbl90eXBlICE9ICJJbmR1c3RyaWFsIHpvbmUiKSAlPiUgDQogIG11dGF0ZShtZWFuX3BhcnRuZXJzID0gbWVhbihwYXJ0bmVycywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYXJ0bmVycywgeSA9IGZjdF9yZXYoc3RhdGUpLCBmaWxsID0gbG9jYXRpb25fdHlwZSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGZhY2V0X3dyYXAofiBsb2NhdGlvbl90eXBlKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRjFDNDBGIiwgIiMxQUJDOUMiLCAiI0VDNzA2MyIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArIA0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBzdGF0ZSBhbmQgbG9jYXRpb24gdHlwZSIpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBBY3Rpdml0aWVzDQoNCiMjIyAyLjEgUHJvZ3Jlc3MgYnkgYWN0aXZpdHkNCg0KVGhlIGRvdHRlZCByZWQgbGluZSBzaG93cyB0aGUgZW5kIG9mIFEyIDIwMjIuIFRoZSB0aGljayBsaW5lIGluIGdyZXkgc2hvd3MgdGhlIHByb2dyZXNzIGluIDIwMjEgZm9yIHRoZSBzYW1lIGFjdGl2aXR5LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgMjAyMSBwcm9ncmVzcyBsaW5lcyBhcmUganVzdCBhIHJlZmVyZW5jZSBhbmQgbm90IG1lYW50IHRvIGJlIGEgZGlyZWN0IGNvbXBhcmlzb24uIFRoZSBzY29wZSBvZiB0aGUgSFJQIHdhcyBtdWNoIGRpZmZlcmVudCBhdCB0aGUgc3RhcnQgb2YgMjAyMSBhbmQgdGhlIHJlc3BvbnNlIG9ubHkgYmVjYW1lIG5hdGlvbndpZGUgaW4gSnVuZTsgdGhlIEZTQyB3YXMgYWxzbyBtdWNoIHNtYWxsZXIgdGhhbiBpdCBpcyBub3cgaW4gMjAyMi4gSW5kZWVkLCB3aXRoIHRoZSBwb3N0LWNvdXAgY3Jpc2lzIGFmZmVjdGluZyBib3RoIGh1bWFuaXRhcmlhbiBhbmQgZGV2ZWxvcG1lbnQgcHJvZ3JhbW1pbmcsIHRoZSBuZWVkIGZvciBzdHJvbmdlciBjb29yZGluYXRpb24gdG8gYWRhcHQgZm9vZCBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nIGhhcyBwdXNoZWQgbWFueSBwYXJ0bmVycyB0byBlbnRlciB0aGUgRlNDLiBUaGlzIHR5cGUgb2YgY29tcGFyaXNvbiB3aWxsIGJlIG1vcmUgdXNlZnVsIG5leHQgeWVhci4gDQoNCjxicj4NCg0KYGBge3IgcHJvZ3Jlc3MtZmFjZXQtbGluZXBsb3R9DQoNCmFjdF9saW5lXzIwMjEgPC0gZnNjXzIwMjEgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICBtdXRhdGUoZGF0ZSA9IGRhdGUgKyB5ZWFycygxKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBzdHJfcmVwbGFjZV9hbGwoYWN0aXZpdHlfcmVkLCAicHJvdmlzaW9uIG9mICIsICIiKSkgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVvdXQlIGMoImZpc2hlcnkga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IikpDQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAjIHJiaW5kKGZzY18yMDIxICU+JSANCiAgIyAgICAgICAgICMgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgIyAgICAgICAgIGdyb3VwX2J5KGRhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICAjICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShhY3Rpdml0eV9yZWQpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IHN0cl9yZXBsYWNlX2FsbChhY3Rpdml0eV9yZWQsICJwcm92aXNpb24gb2YgIiwgIiIpKSAlPiUNCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJmaXNoZXJ5IGtpdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tdW5pdHkgaW5mcmFzdHJ1Y3R1cmUgYW5kIGVxdWlwbWVudCIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBhY3Rpdml0eV9yZWQpKSArDQogIGdlb21fc3RlcChkYXRhID0gYWN0X2xpbmVfMjAyMSwgDQogICAgICAgICAgICBhZXMoeCA9IGRhdGUsIA0KICAgICAgICAgICAgICAgIHkgPSBjdW1fYmVuKSwgDQogICAgICAgICAgICBjb2xvdXIgPSAiZ3JleSIsDQogICAgICAgICAgICBzaXplID0gMiwgDQogICAgICAgICAgICBhbHBoYSA9IC40KSArIA0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyLCB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTA2LTAxIikpLCBhbHBoYSA9IC41KSArDQogICMgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wMy0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3N0ZXAoc2l6ZSA9IDEpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHlfcmVkLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgYXMgb2YgSnVseSAyMDIyIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGFyZSBpbiBjdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHJlYWNoZWQ7IHByZXZpb3VzIHllYXIncyBwcm9ncmVzcyBpcyBpbiBncmV5OyByZWQgbGluZSBtYXJrcyBKdW4gMjAyMiIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCiAgDQojIGdnc2F2ZSgiYWN0aXZpdHlfZmFjZXRfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKSAgDQoNCmBgYA0KDQo8YnI+DQoNCkluIEp1bHkgMjAyMiwgcHJvZ3Jlc3MgcHJpbWFyaWx5IGNhbWUgZnJvbSBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzLCBmYXJtZXIgdHJhaW5pbmcsIGZvb2QgZGlzdHJpYnV0aW9ucyBhbmQgdm9jYXRpb25hbCB0cmFpbmluZy4gDQoNCjxicj48YnI+DQoNCiMjIyAyLjIgQWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kcyBhY3Rpdml0aWVzDQoNCmBgYHtyfQ0KYWdfbGlzdCA8LSBjKCJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsDQogICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLA0KICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIpDQoNCg0KYGBgDQoNCmByIGZpbHRlcihmc2MsIGFjdGl2aXR5X3JlZCAlaW4lIGMoYWdfbGlzdCkpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgdGhyb3VnaCBhIGNvbWJpbmF0aW9uIG9mIGNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzLCBGRlMgYW5kIGZhcm1lciB0cmFpbmluZywgSUdBIGFuZCBzbWFsbCBncmFudHMgYW5kIGxpdmVzdG9jayBraXRzLiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1hZ3JpLWFjdGl2aXRpZXN9DQpmc2MgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVpbiUgYygiY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkZTIGFuZCBmYXJtZXIgdHJhaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGl2ZXN0b2NrIGtpdHMiKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGp1bHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGp1bHksIA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodG90YWwgPSBqYW5fdG9fanVuICsganVseSkgJT4lIA0KICBtdXRhdGUoYCVfdG90YWxgID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JSAgDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIHJlbmFtZShhY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgYWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kIGFjdGl2aXRpZXMiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCANCiAgICAgICAgICAgaSA9IDEsIGogPSA0LA0KICAgICAgICAgICAgIHZhbHVlID0gYXNfcGFyYWdyYXBoKCgiYXMgb2YgMzEgSnVseSAyMDIyIikpKQ0KICANCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAyLjMgRGVsaXZlcnkgbW9kYWxpdGllcw0KDQpPbmx5IEhFQiBhbmQgZm9ydGlmaWVkIHJpY2UsIGNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IGFuZCBraXRjaGVuIGdhcmRlbiBraXRzIHdlcmUgZGVsaXZlcmVkIGVudGlyZWx5IHRocm91Z2ggaW4ta2luZCBtb2RhbGl0aWVzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkZWxpdmVyeV9tb2RhbGl0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JQ0KICAgICAgICAgIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZShCZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICBieSA9ICJhY3Rpdml0eV9yZWQiKSAlPiUNCiAgYXJyYW5nZShkZXNjKEJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IGlmZWxzZShhY3Rpdml0eV9yZWQgJWluJSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUIgYW5kIGZvcnRpZmllZCByaWNlIGZvciBhY3V0ZSBlbWVyZ2VuY2llcyIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3RvX3NlbnRlbmNlKGFjdGl2aXR5X3JlZCkpKSAlPiUgDQogIHJlbmFtZShBY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhgSW4ta2luZGAsIGBTZXJ2aWNlIGRlbGl2ZXJ5YCwgYENCVC9DVkFgLCBgSHlicmlkYCksIA0KICAgICAgICAgICAgfnJlY29kZSguLCAiLSIgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lDQogIGZpbHRlcihCZW5lZmljaWFyaWVzICE9IDApICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiUGVyY2VudGFnZSBvZiBiZW5maWNpYXJpZXMgcmVhY2hlZCBieSBhY3Rpdml0eSBhbmQgZGVsaXZlcnkgbW9kYWxpdHkiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCANCiAgICAgICAgICAgaSA9IDEsIGogPSA2LCANCiAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoImFzIG9mIDMxIEp1bHkgMjAyMiIpKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGVyZSBhcmUgYWxzbyBjbGVhciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgYmVuZWZpY2lhcnkgdHlwZXMgYW5kIHRoZSBkZWxpdmVyeSBtb2RhbGl0aWVzIGVtcGxveWVkIHdpdGggdGhlbS4gQmVuZWZpY2lhcmllcyBmcm9tIGhvc3QvbG9jYWwgY29tbXVuaXRpZXMgbGFyZ2VseSByZWNlaXZlZCBpbi1raW5kIGRpc3RyaWJ1dGlvbnMgd2hpbHN0IHRob3NlIGZyb20gY2FtcHMgYW5kIElEUCBzaXRlcyBtb3N0bHkgcmVjZWl2ZWQgY2FzaC1iYXNlZCBpbnRlcnZlbnRpb25zLCBpbmRpY2F0aW5nIHRoYXQgcGFydG5lcnMgbW9zdGx5IHdvcmtlZCBpbiB0aGUgc2FtZSBhcmVhcyBpbiBRMSBhbmQgUTIuIA0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LWJlbi10eXBlLCBmaWcuaGVpZ2h0PTZ9DQoNCmZzYyAlPiUgIA0KICAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSAmICFpcy5uYShsb2NhdGlvbl90eXBlKSkgJT4lIA0KICBzdW1fYmVuMihkZWxpdmVyeV9tb2RhbGl0eSwgbG9jYXRpb25fdHlwZSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBkZWxpdmVyeV9tb2RhbGl0eSkpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGZhY2V0X3dyYXAofmxvY2F0aW9uX3R5cGUsIHNjYWxlcyA9ICJmcmVlIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgdmp1c3QgPSAuNywgaGp1c3QgPSAuNSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpICsNCiAgbGFicyh4ID0gIkRlbGl2ZXJ5IG1vZGFsaXR5IiwgeSA9ICJCZW5lZmljaWFyaWVzIiwNCiAgICAgICB0aXRsZSA9ICJEZWxpdmVyeSBtb2RhbGl0aWVzIGJ5IGxvY2F0aW9uIHR5cGUiKQ0KICANCg0KYGBgDQoNCjxicj4NCg0KQXJlYXMgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgSURQcywgc3VjaCBhcyBTYWdhaW5nLCBSYWtoaW5lIGFuZCBLYWNoaW4sIHJlYWNoIG1vc3Qgb2YgdGhlaXIgYmVuZWZpY2lhcmllcyB0aHJvdWdoIGNhc2gtYmFzZWQgcHJvZ3JhbW1pbmcuDQoNCjxicj4NCg0KYGBge3IgZGVsaXZlcnktbW9kYWxpdGllcy1zdGFja2VkLWJhcn0NCnN0YXRlX3RvdGFscyA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IDEsIA0KICAgICAgICAgc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgdG90YWwpKQ0KDQpmc2MgJT4lICANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSAgDQogICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgZ3JvdXBfYnkoc3RhdGUsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICBzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGZjdF9yZXYoc3RhdGUpLCBmaWxsID0gZGVsaXZlcnlfbW9kYWxpdHkpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQsIGJyZWFrcyA9IHNlcSgwLCAxLCBieSA9IC4yKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyh5ID0gc3RhdGUsIHggPSBwYyArIDAuMTI1LCBsYWJlbCA9IGNvbW1hKHRvdGFsLCBhY2N1cmFjeSA9IDEpLCBmaWxsID0gTlVMTCksIA0KICAgICAgICAgICAgZGF0YSA9IHN0YXRlX3RvdGFscywgaGp1c3QgPSAiaW53YXJkIiwgc2l6ZSA9IDIuNSkgKw0KICBsYWJzKHggPSAiJSBvZiB0b3RhbCIsIHkgPSAiIiwgZmlsbCA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBkZWxpdmVyeSBtb2RhbGl0aWVzIiwgDQogICAgICAgc3VidGl0bGUgPSAiQmVuZWZpY2lhcmllcyBhcyBvZiAzMSBKdWx5IDIwMjIgYXQgdGhlIGVuZCBvZiBlYWNoIGJhciIpDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMy4gQ2FzaC1iYXNlZCBwcm9ncmFtbWluZw0KDQojIyMgMy4xIE1NSyBwZXIgaG91c2Vob2xkDQoNCkNvbXBhcmVkIHRvIFExLCBiZW5lZmljaWFyaWVzIGluIFEyIGFyZSBtdWNoIGxlc3MgbGlrZWx5IHRvIGhhdmUgcmVjZWl2ZWQgY2FzaCB0cmFuc2ZlcnMgb2YgbGVzcyB0aGFuIFVTRCAxMCBwZXIgaG91c2Vob2xkLiBUaGUgbW9zdCBjb21tb24gdHJhbnNmZXIgdmFsdWVzIHdlcmUgYmV0d2VlbiBVU0QgNjAgYW5kIDcwLCBhbiBpbmNyZWFzZSBmcm9tIHRoZSBwcmV2aW91cyBxdWFydGVyLg0KDQpJbiBKdWx5IDIwMjIsIHRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlcnMgdmFsdWVzIHdlcmUgYmV0d2VlbiBNTUsgMTAwLDAwMCBhbmQgTU1LIDIwMCwwMDAsIA0KDQoNCjxicj4NCg0KYGBge3IgdXNkLWhoZC1iaW4tYmFycGxvdCwgZmlnLmhlaWdodD02LjV9DQoNCmZzYyAlPiUNCiAgZmlsdGVyKCFpcy5uYShtbWtfcGVyX2hoZCkgJiAhaXMubmEobmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGZpbHRlcihkZWxpdmVyeV9tb2RhbGl0eSAlaW4lIGMoIkNCVC9DVkEiLCAiSHlicmlkIChJbi1raW5kICYgQ0JUL0NWQSkiKSkgJT4lDQogIGdyb3VwX2J5KG1ta19oaGRfYmluLCBqdWx5KSAlPiUgDQogIHN1bW1hcmlzZShob3VzZWhvbGRzID0gc3VtKGhvdXNlaG9sZHMpKSAlPiUgDQogIGdyb3VwX2J5KGp1bHkpICU+JSANCiAgbXV0YXRlKGAlX29mX2hoZGAgPSByb3VuZChob3VzZWhvbGRzIC8gc3VtKGhvdXNlaG9sZHMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgbXV0YXRlKG1ta19oaGRfYmluID0gZmN0X3JlbGV2ZWwobW1rX2hoZF9iaW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiPDEwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwS188MzBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzBLXzwxMDBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwS188MjAwSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwS188MzAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwMEtfPDFNIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0xTSIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtbWtfaGhkX2JpbiwgeSA9IGhvdXNlaG9sZHMsIGZpbGwgPSBtbWtfaGhkX2JpbikpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGAlX29mX2hoZGApLCB2anVzdCA9IC0wLjQsIHNpemUgPSAzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IHNlcSgwLCA4MDAwMCwgYnkgPSAxMDAwMCkpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMC44LCB2anVzdCA9IDAuOSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKw0KICBsYWJzKHggPSAiTU1LIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgaG91c2Vob2xkcyIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGhvdXNlaG9sZHMgYnkgdmFsdWUgb2YgY2FzaCB0cmFuc2ZlciBwZXIgaG91c2Vob2xkIChKdWx5IDIwMjIpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGF0IHRoZSB0b3Agb2YgZWFjaCBiYXIgc2hvdyBwZXJjZW50YWdlIG9mIGhvdXNlaG9sZHNcbk9ubHkgaG91c2Vob2xkcyByZWFjaGVkIHRocm91Z2ggdGhlIGNhc2gsIGh5YnJpZCBvciB2b3VjaGVyIG1vZGFsaXRpZXMgYXJlIGluY2x1ZGVkIikNCg0KYGBgDQoNCjxicj4NCg0KQWJvdXQgNDAlIG9mIGJlbmVmaWNpYXJpZXMgb2YgbXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVycyBpbiBKdWx5IDIwMjIgd2VyZSBvZiBxdWl0ZSBoaWdoIHZhbHVlLiANCg0KPGJyPg0KDQpgYGB7cn0NCg0KYWN0aXZpdHlfdG90YWxzIDwtIGZzYyAlPiUNCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAhPSAibWljcm9maW5hbmNlIGFjdGl2aXRpZXMiKSAlPiUgDQogIG11dGF0ZShwYyA9IDEsIA0KICAgICAgICAgYWN0aXZpdHlfcmVkID0gZmN0X3Jlb3JkZXIoYWN0aXZpdHlfcmVkLCB0b3RhbCkpDQogIA0KZnNjICU+JSAgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIG1ta19oaGRfYmluKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocGMgPSBiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgIT0gIm1pY3JvZmluYW5jZSBhY3Rpdml0aWVzIikgJT4lIA0KICBtdXRhdGUobW1rX2hoZF9iaW4gPSBmY3RfcmVsZXZlbChtbWtfaGhkX2JpbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIjwxMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMEtfPDMwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwS188MTAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMEtfPDIwMEsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMEtfPDMwMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMDBLXzwxTSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49MU0iKSkpICU+JSANCiAgYXJyYW5nZShtbWtfaGhkX2JpbikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGFjdGl2aXR5X3JlZCwNCiAgICAgICAgICAgICBmaWxsID0gZmN0X3JlbGV2ZWwobW1rX2hoZF9iaW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCI8MTBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTBLXzwzMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMEtfPDEwMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDBLXzwyMDBLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDBLXzwzMDBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAwS188MU0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PTFNIikpKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCwgYnJlYWtzID0gc2VxKDAsIDEsIGJ5ID0gLjIpKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTUwIikgKyANCiAgZ2VvbV90ZXh0KGFlcyh5ID0gYWN0aXZpdHlfcmVkLCANCiAgICAgICAgICAgICAgICB4ID0gcGMgKyAuMTI1LCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IGNvbW1hKHRvdGFsLCBhY2N1cmFjeSA9IDEpLCBmaWxsID0gTlVMTCksIA0KICAgICAgICAgICAgZGF0YSA9IGFjdGl2aXR5X3RvdGFscywgaGp1c3QgPSAiaW53YXJkIiwgc2l6ZSA9IDMuNSkgKyANCiAgbGFicyh4ID0gIiUgb2YgYWN0aXZpdHkgdG90YWwiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIGZpbGwgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBjYXNoIGJlbmVmaWNpYXJpZXMgYnkgYWN0aXZpdHksIEp1bHkgMjAyMiIsIA0KICAgICAgIHN1YnRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBKdWx5IDIwMjIgYXQgdGhlIGVuZCBvZiBlYWNoIGJhclxuR3JleS9OQSBzaG93cyBiZW5lZmljaWFyaWVzIG9mIG5vbi1jYXNoIGludGVydmVudGlvbnMiKQ0KDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgTU1LIHBlciBwZXJzb24NCg0KVGhlIGJveHBsb3RzIGJlbG93IHNob3dzIHRoZSByYW5nZSBvZiBjYXNoIHRyYW5zZmVyIHZhbHVlcyAoYWxsIHZhbHVlcyBhcmUgcGVyIHBlcnNvbiwgdG8gZmFjaWxpdGF0ZSBjb21wYXJhYmlsaXR5KSBieSBhY3Rpdml0eS4gVGhlIGF2ZXJhZ2UgZm9yIHJlYWNoIGFjdGl2aXR5IGlzIG1hcmtlZCBieSB0aGUgdGhpY2sgbGluZSBpbiB0aGUgbWlkZGxlIG9mIGVhY2ggYm94LiBUaGUgbGVmdG1vc3QgYW5kIHJpZ2h0bW9zdCBzaWRlIG9mIGVhY2ggYm94IGluZGljYXRlIHRoZSAyNXRoIGFuZCA3NXRoIHBlcmNlbnRpbGUgb2YgdHJhbnNmZXIgdmFsdWVzLCByZXNwZWN0aXZlbHkuIFRoZSBsZW5ndGggb2YgZWFjaCBib3ggaXMgYSBnYXVnZSBmb3IgaG93IG11Y2ggdmFyaWF0aW9uIHRoZXJlIGlzIGluIHRoZSB0cmFuc2ZlciB2YWx1ZXMgb2YgZWFjaCBhY3Rpdml0eS4NCg0KVGhlc2UgcGxvdHMgdXNlIGRhdGEgZm9yIHRoZSBlbnRpcmUgeWVhciwgaW5zdGVhZCBvZiBqdXN0IEp1bHkuIA0KDQo8YnI+DQoNCmBgYHtyIGJveHBsb3QtYWN0aXZpdHktdXNkLXBlci1wZXJzb259DQoNCmZzYyAlPiUgZmlsdGVyKCFpcy5uYSh0b3RhbF92YWx1ZV9tbWspICYgDQogICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIsICJ2b2NhdGlvbmFsIHRyYWluaW5nIikpICU+JQ0KICBtdXRhdGUoYWN0aXZpdHlfcmVkID0gZmN0X3JldihmY3RfcmVsZXZlbChhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiZm9vZCBkaXN0cmlidXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCwgdmVnZW50YWJsZSBhbmQgc2VlZCBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29kX2Nhc2ggZm9yIHdvcmtfYXNzZXRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJR0EgYW5kIHNtYWxsIGdyYW50cyIpKSkpICU+JSANCiAgYXJyYW5nZShhY3Rpdml0eV9yZWQpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gYWN0aXZpdHlfcmVkLCANCiAgICAgICAgICAgICB4ID0gbW1rX3Blcl9wZXJzb24sIA0KICAgICAgICAgICAgIGNvbG91ciA9IGFjdGl2aXR5X3JlZCkpICsgDQogIGdlb21faml0dGVyKGFscGhhID0gLjEsIA0KICAgICAgICAgICAgICBhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21fYm94cGxvdChhbHBoYSA9IC44LCANCiAgICAgICAgICAgICAgIG91dGxpZXIuYWxwaGEgPSAuMikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMDAwLCAzMDAwMCwgMTAwMDAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMDAwLCAxMDAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IC41LCB2anVzdCA9IC41KSkgKw0KICBsYWJzKHggPSAiTU1LIHBlciBwZXJzb24iLCB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkJveHBsb3RzIG9mIE1NSyB0cmFuc2ZlciB2YWx1ZXMgcGVyIHBlcnNvbiwgYXMgb2YgSnVseSAyMDIyIiwgDQogICAgICAgc3VidGl0bGUgPSAiVGhpY2sgbGluZSBpbiBlYWNoIGJveCBpcyB0aGUgYXZlcmFnZTtcbiBQb2ludHMgYXJlIGluZGl2aWR1YWwgaW50ZXJ2ZW50aW9ucywgc2l6ZXMgaW5kaWNhdGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiKQ0KDQogDQpgYGANCg0KPGJyPg0KDQpFYWNoIG9mIHRoZSBidWJibGVzIHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBpbnRlcnZlbnRpb24sIHdpdGggdGhlaXIgcG9zaXRpb24gYWxvbmcgdGhlIHgtYXhpcyBzaG93aW5nIHRoZSBVU0QgcGVyIHBlcnNvbiB2YWx1ZSBvZiB0aGUgaW50ZXJ2ZW50aW9uIGFuZCB0aGUgc2l6ZSBvZiBlYWNoIGJ1YmJsZSBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkLg0KDQpGb29kIGRpc3RyaWJ1dGlvbnMgdGVuZGVkIHRvIGhhdmUgdGhlIHRpZ2h0ZXN0IHJhbmdlIG9mIHZhbHVlcywgd2hpY2ggcHJvdmVzIHRoYXQgZm9vZCBhc3Npc3RhbmNlIGlzIHF1aXRlIHN0YW5kYXJkaXNlZCBhbW9uZ3N0IHBhcnRuZXJzLiANCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktdHJhbnNmZXItdmFsdWUtc2NhdHRlciwgZmlnLmhlaWdodD02fQ0KDQptb25leV9zY2F0dGVyIDwtIGZzYyAlPiUgDQogIGZpbHRlcighaXMubmEodG90YWxfdmFsdWVfbW1rKSAmIA0KICAgICAgICAgICBhY3Rpdml0eV9yZWQgJW91dCUgYygibGl2ZXN0b2NrIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm9jYXRpb25hbCB0cmFpbmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIpKSAlPiUNCiAgZ3JvdXBfYnkoc3RhdGUsIHRvd25zaGlwLCBsb2NhdGlvbiwgDQogICAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVyLCANCiAgICAgICAgICAgYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRvdGFsX3ZhbHVlID0gc3VtKHRvdGFsX3ZhbHVlX21tayksIA0KICAgICAgICAgICAgcm91bmRzID0gbl9kaXN0aW5jdChkYXRlKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShwZXJfcGVyc29uID0gcm91bmQodG90YWxfdmFsdWUgLyBiZW5lZmljaWFyaWVzLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIodG90YWxfdmFsdWUgPiAwKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgeSA9IHBlcl9wZXJzb24sIA0KICAgICAgICAgICAgIGNvbG91ciA9IGFjdGl2aXR5X3JlZCwgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChpbXBsZW1lbnRpbmdfcGFydG5lciwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbi4gZnJlcXVlbmNpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTU1LIHBlciBwZXJzb246ICIsIGNvbW1hKHBlcl9wZXJzb24sIGFjY3VyYWN5ID0gMSksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIE1NSzogIiwgY29tbWEodG90YWxfdmFsdWUsIGFjY3VyYWN5ID0gMSksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvdW5kczogIiwgcm91bmRzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvd25zaGlwLCAiLCAiLCBzdGF0ZSkpKSArIA0KICBnZW9tX2ppdHRlcihhZXMoc2l6ZSA9IHRvdGFsX3ZhbHVlKSwgYWxwaGEgPSAuNSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEsIDMsIDEwLCAzMCwgMTAwLCAzMDApLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMTAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzAwMDAwKSkgKyANCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiLCByYW5nZSA9IGMoMC4zLCA1KSkgKyANCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgeSA9ICJNTUsgdmFsdWUgcGVyIHBlcnNvbiIsIA0KICAgICAgIHRpdGxlID0gIkF2ZXJhZ2UgTU1LIHRyYW5zZmVyIHZhbHVlIHBlciBwZXJzb24gaW4gMjAyMlxuQnkgb3JnYW5pc2F0aW9uLCBsb2NhdGlvbiBhbmQgYWN0aXZpdHkiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJCeSBvcmdhbmlzYXRpb24sIGxvY2F0aW9uIGFuZCBhY3Rpdml0eSIsIA0KICAgICAgIGNvbG91ciA9ICJieSBvcmcsIGxvY2F0aW9uIGFuZCBhY3Rpdml0eVxuZG91YmxlLWNsaWNrIHRvIHNlbGVjdCIpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMSwgYWxwaGEgPSAxKSkpIA0KDQpnZ3Bsb3RseShtb25leV9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiQXZlcmFnZSBNTUsgdHJhbnNmZXIgdmFsdWUgcGVyIHBlcnNvbiwgYXMgb2YgMzEgSnVseSAyMDIyIikpKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMy4zIEZvb2QgZGlzdHJpYnV0aW9ucw0KDQpgYGB7ciBwbG90bHktZm9vZC1kaXN0LXJhbmdlfQ0KDQpmb29kX2Rpc3RfcmFuZ2UgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShtbWtfcGVyX3BlcnNvbikpICU+JQ0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIgJiBtbWtfcGVyX3BlcnNvbiA8IDYwMDAwMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtbWtfcGVyX3BlcnNvbiwgeSA9IHN0YXRlLCBjb2xvdXIgPSBzdGF0ZSwgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChpbXBsZW1lbnRpbmdfcGFydG5lciwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbi4gZnJlcXVlbmNpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTU1LIHBlciBwZXJzb246ICIsIGNvbW1hKG1ta19wZXJfcGVyc29uKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgTU1LOiAiLCBjb21tYSh0b3RhbF92YWx1ZV9tbWssIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0b3duc2hpcCwgIiwgIiwgc3RhdGUpKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTkwNTUuNSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIsIGFscGhhID0gLjUsIHNpemUgPSAuMykgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjEsIGFlcyhzaXplID0gYmVuZWZpY2lhcmllcykpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZCgpICsNCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygwLjMsIDEwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSksIA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSArDQogIGxhYnMoeCA9ICJNTUsgdmFsdWUgcGVyIHBlcnNvbiIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiRm9vZCBkaXN0cmlidXRpb246IHJhbmdlIG9mIE1NSyB2YWx1ZXMgcGVyIHBlcnNvbiBieSBzdGF0ZSBpbiAyMDIyLCBhcyBvZiAzMS0wNy0yMDIyIiwNCiAgICAgICBzaXplID0gIiIsIGNvbG91ciA9ICIiKSANCg0KZ2dwbG90bHkoZm9vZF9kaXN0X3JhbmdlLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gIDYwMCkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lDQogIGxheW91dCh0aXRsZSA9IA0KICAgICAgICAgICBsaXN0KHRleHQgPSANCiAgICAgICAgICAgICAgICAgIHBhc3RlMCgiRm9vZCBkaXN0cmlidXRpb246IE1NSyB2YWx1ZXMgYnkgc3RhdGUsIGFzIG9mIDMxLTA3LTIwMjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcmVkIGxpbmUgaXMgNTAlIG9mIDEvNSBvZiBmb29kIE1FQjsgZG91YmxlLWNsaWNrIG9uIGxlZ2VuZCB0byBzZWxlY3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICI8L3N1cD4iKSksIA0KICAgICAgICAgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNykpKSANCmBgYA0KDQo8YnI+DQoNCkJlbmVmaWNpYXJpZXMgaW4gUmFraGluZSBhcmUgc3BsaXQgaW50byB0d28gZ3JvdXBzLCBvbmUgYXQgYXJvdW5kIE1NSyA3LDAwMCBhbmQgYW5vdGhlciBhdCBNTUsgMTcsMDAwLiBLYXlpbiBoYXMgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiBwZXJzb25zIHdobyByZWNlaXZlZCBsZXNzIHRoYW4gTU1LIDEsMDAwIGVhY2guIA0KDQpEaXN0cmlidXRpb25zIGluIENoaW4gYW5kIEF5ZXlhcndhZHkgaGFkIHZlcnkgY29uc2lzdGVudCB2YWx1ZXMgYXMgdGhleSB3ZXJlIGFsbCBpbXBsZW1lbnRlZCBieSB0aGUgc2FtZSBpbXBsZW1lbnRpbmcgcGFydG5lci4NCg0KVGhlIHRhYmxlIGJlbG93IGNvbXBhcmVzIHRoZSBkaWZmZXJlbnQgYmlucyBmb3IgY2FzaCB0cmFuc2ZlciB2YWx1ZXMgb2YgZm9vZCBkaXN0cmlidXRpb25zIHdpdGggdGhlIG1pbmltdW0gZXhwZW5kaXR1cmUgYmFza2V0IGZvciBmb29kIGVzdGFibGlzaGVkIGJ5IHRoZSBDYXNoIFdvcmtpbmcgR3JvdXAuIFRoZXkgaGF2ZSBlc3RhYmxpc2hlZCBhIGZsb29yIG9mIE1NSyAxOTAsNTU1IChvciBVU0QgMTE0LjU1KSBmb3IgdGhlIGZvb2Qgc2VjdXJpdHkgY29tcG9uZW50IHBlciBob3VzZWhvbGQgcGVyIG1vbnRoLiANCg0KT3ZlcmFsbCwgYHIgcm91bmQoKGZpbHRlcihmc2MsIHVzZF9wZXJfcGVyc29uID49ICgxMTQuNTUgLyA1KSAmIGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pIC8gKGZpbHRlcihmc2MsICFpcy5uYSh1c2RfcGVyX3BlcnNvbikgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBmb29kIGRpc3RyaWJ1dGlvbiBiZW5lZmljaWFyaWVzIGhhdmUgcmVjZWl2ZWQgYXQgbGVhc3QgMTAwJSBvZiB0aGUgZm9vZCBzZWN1cml0eSBNRUIgYW5kIGByIHJvdW5kKChmaWx0ZXIoZnNjLCB1c2RfcGVyX3BlcnNvbiA+PSAoMTE0LjU1IC8gNSAvIDIpICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgLyAoZmlsdGVyKGZzYywgIWlzLm5hKHVzZF9wZXJfcGVyc29uKSAmIGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIGhhdmUgcmVjZWl2ZWQgYXQgbGVhc3QgNTAlIG9mIHRoZSBmb29kIHNlY3VyaXR5IE1FQiAoTU1LIDE5LDA1NiBvciBVU0QgMTEuNDUgcGVyIHBlcnNvbikuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtbWViLXVzZC1oaGQtYmlufQ0KDQpmb29kX2JpbnMgPC0gZnNjICU+JSBmaWx0ZXIoYWN0aXZpdHlfcmVkICVpbiUgYygiZm9vZCBkaXN0cmlidXRpb24iKSAmIA0KICAgICAgICAgICAgICAgICAhaXMubmEobW1rX3Blcl9wZXJzb24pICYgDQogICAgICAgICAgICAgICAgICFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgY291bnQobW1rX3BlcnNvbl9iaW4sIHd0ID0gbmV3X2JlbmVmaWNpYXJpZXMpICU+JSANCiAgbXV0YXRlKHBjX29mX3RvdGFsID0gcm91bmQobiAvIHN1bShuKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShtbWtfcGVyc29uX2JpbikNCg0KZnNjICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlaW4lIGMoImZvb2QgZGlzdHJpYnV0aW9uIikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEobW1rX3Blcl9wZXJzb24pICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lDQogIG11dGF0ZShwY19tZWIgPSBtbWtfcGVyX3BlcnNvbiAqIDUgLyAxOTA1NTUpICU+JSANCiAgZ3JvdXBfYnkobW1rX3BlcnNvbl9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGF2Z19wY19vZl9tZWIgPSByb3VuZChtZWFuKHBjX21lYikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYXZnX21ta19tb250aCA9IHJvdW5kKG1lYW4obW1rX3Blcl9wZXJzb24sIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHJvdW5kKHN1bShuZXdfYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIG11dGF0ZShwY19vZl9oaGQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIG1ta19wZXJzb25fYmluID0gZmN0X3JlbGV2ZWwobW1rX3BlcnNvbl9iaW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiPDEwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwS188MzBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzBLXzw2MEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MEtfPDEwMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDBLXzwyMDBLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDBLXzwzMDBLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMDBLXzwxTSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49MU0iKSkpICU+JSANCiAgYXJyYW5nZShtbWtfcGVyc29uX2JpbikgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJNTUsgdmFsdWVzIG9mIGZvb2QgZGlzcmlidXRpb25zIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIikgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIGZvb3Rub3RlKHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgaSA9IDEsIGogPSA0LCANCiAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoIk9ubHkgcGVyc29ucyByZWFjaGVkIHRocm91Z2ggQ0JUL0NWQSBtb2RhbGl0aWVzIGFyZSBpbmNsdWRlZCIpKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMy40IEltcGxlbWVudGluZyBwYXJ0bmVycw0KDQpUaGUgcGxvdHMgYmVsb3cgc2hvdyB0aGUgdGhlIGF2ZXJhZ2UgY2FzaCB0cmFuc2ZlciB2YWx1ZXMgYnkgYWN0aXZpdHkgZm9yIHRoZSB0b3AgNyBwYXJ0bmVycyBpbXBsZW1lbnRpbmcgdGhhdCBhY3Rpdml0eS4gVGhlIHgtYXhpcyBzaG93cyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhbmQgdGhlIGRlcHRoIG9mIHRoZSBjb2xvdXIgaW5kaWNhdGVzIHRoZSB2YWx1ZSBvZiB0aGUgY2FzaCB0cmFuc2Zlci4gDQoNCjxicj4NCg0KYGBge3IgcGFydG5lci1jYXNoLXZhbHVlcywgZmlnLmhlaWdodD02LjV9DQpwYXJ0bmVyX21lYW5fbW1rIDwtIGZ1bmN0aW9uKHRibCwgbmFtZSl7DQoNCiAgdGJsICU+JSANCiAgICBmaWx0ZXIoIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSAmICFpcy5uYShtbWtfcGVyX2hoZCkpICU+JQ0KICAgIGZpbHRlcihkZWxpdmVyeV9tb2RhbGl0eSAlaW4lIGMoIkNCVC9DVkEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIeWJyaWQgKEluLWtpbmQgJiBDQlQvQ1ZBKSIpKSAlPiUNCiAgICBmaWx0ZXIoYWN0aXZpdHlfcmVkID09IHt7bmFtZX19KSAlPiUNCiAgICBtdXRhdGUoaG91c2Vob2xkcyA9IGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXNlaG9sZHMpKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgICBzdW1tYXJpc2UodG90YWxfdmFsdWVfbW1rID0gc3VtKHRvdGFsX3ZhbHVlX21tayksDQogICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICAgaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lIA0KICAgIG11dGF0ZShtZWFuX21tayA9IHRvdGFsX3ZhbHVlX21tayAvIGhvdXNlaG9sZHMpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgdG9wX24oNykgJT4lIA0KICAgIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IGZjdF9yZW9yZGVyKGltcGxlbWVudGluZ19wYXJ0bmVyLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgICAgeSA9IGltcGxlbWVudGluZ19wYXJ0bmVyLCANCiAgICAgICAgICAgICAgIGZpbGwgPSBtZWFuX21taykpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCBiZWdpbiA9IDAuMiwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogICAgZ2VvbV9jb2woKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKG1lYW5fbW1rKSksIA0KICAgICAgICAgICAgICBzaXplID0gMywgDQogICAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsgDQogICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICBmaWxsID0gIkF2ZyBNTUsiKSArDQogICAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwNCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNS41KSwgDQogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpDQp9DQoNCmZzYyAlPiUgcGFydG5lcl9tZWFuX21taygibXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIikgKw0KICBsYWJzKHRpdGxlID0gIk11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciAocGVyIGhoZCkiKSArIA0KZnNjICU+JSBwYXJ0bmVyX21lYW5fbW1rKCJmb29kIGRpc3RyaWJ1dGlvbiIpICsNCiAgbGFicyh0aXRsZSA9ICJGb29kIGRpc3RyaWJ1dGlvbnMgKHBlciBwZXJzb24pIikgKw0KZnNjICU+JSBwYXJ0bmVyX21lYW5fbW1rKCJmb29kX2Nhc2ggZm9yIHdvcmtfYXNzZXRzIikgKyANCiAgbGFicyh0aXRsZSA9ICJGb29kL2Nhc2ggZm9yIHdvcmsvYXNzZXRzIChwZXIgaGhkKSIpICsgDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl9tbWsoIklHQSBhbmQgc21hbGwgZ3JhbnRzIikgKw0KICBsYWJzKHRpdGxlID0gIklHQSBhbmQgc21hbGwgZ3JhbnRzIChwZXIgaGhkKSIpICsgDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICJDYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiB0aGUgdG9wIGltcGxlbWVudGluZyBwYXJ0bmVycyAoYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkKSIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBhY3Rpdml0eSIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyA0LiBQYXJ0bmVycw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCBldmFsPUZBTFNFfQ0KDQpmc2MgJT4lIHNlbGVjdChvcmdfY29kZSA9IHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSANCiAgcmJpbmQoDQogICAgZnNjICU+JSBzZWxlY3Qob3JnX2NvZGUgPSBpbXBsZW1lbnRpbmdfcGFydG5lcikNCiAgKSAlPiUgDQogIGRpc3RpbmN0KG9yZ19jb2RlKSAlPiUgbnJvdygpDQoNCmZzYyAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIG5yb3coKQ0KDQpmc2MgJT4lIGRpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgbnJvdygpDQoNCmBgYA0KDQoNCkEgdG90YWwgb2YgNzUgcGFydG5lcnMgaGF2ZSByZXBvcnRlZCBpbnRvIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgYXMgb2YgSnVseSAyMDIyIC0tIHRoZXJlIGFyZSA2NiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYW5kIDI4IHJlcG9ydGluZyBwYXJ0bmVycy4gVGhpcyBmaXJzdCBpbnN0YW5jZSBvZiBtb250aGx5IHJlcG9ydGluZyBoYXMgc2VlbiBhIHNpZ25pZmljYW50IGRpcCBpbiBzdWJtaXNzaW9ucywgYnV0IHJlc3BvbnNlIGhhcyBvdmVyYWxsIGJlZW4gYmV0dGVyIHRoYW4gZXhwZWN0ZWQuIA0KDQpBbGwgdGhpcyBtZWFucyBpcyB0aGF0IHNldmVyYWwgcGFydG5lcnMgYXJlIHdhaXRpbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgcXVhcnRlciB0byByZXBvcnQgaW4uIA0KDQpUaGlzIHNlY3Rpb24gd2lsbCBtb3N0bHkgb25seSBsb29rIGF0IHllYXItdG8tZGF0ZSBhY2hpZXZlbWVudHMuIA0KDQo8YnI+DQoNCmBgYHtyIGxpbmVwbG90LXBhcnRuZXJzfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoaW1wbGVtZW50aW5nID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgcmVwb3J0aW5nID0gbl9kaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoaW1wbGVtZW50aW5nLCByZXBvcnRpbmcpLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAicGFydG5lciIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImNvdW50IikgJT4lDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjb3VudCwgDQogICAgICAgICAgICAgY29sb3VyID0gcGFydG5lcikpICsgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuNSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnQpLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIA0KICAgICAgICAgICAgdmp1c3QgPSAtLjMpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViLSV5IiwgDQogICAgICAgICAgICAgICBkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIikgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiNGMzlDMTIiLCAiIzBFNjY1NSIpKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIk51bWJlciBvZiBwYXJ0bmVycyIsIA0KICAgICAgIGNvbG91ciA9ICJQYXJudGVyXG50eXBlIiwNCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgcGFydG5lcnMgcmVwb3J0aW5nIGJ5IG1vbnRoLCAzMSBKdWx5IDIwMjIiKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMSBJbXBsZW1lbnRpbmcgcGFydG5lcnMNCg0KVGhlcmUgYXJlIGByIGZzYyAlPiUgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSBucm93KClgIHBhcnRuZXJzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiBkaXJlY3QgaW1wbGVtZW50YXRpb24gdGhhdCBoYXZlIHJlcG9ydGVkIGFjaGlldmVtZW50cyBpbiBKdWx5IDIwMjIsIGluIGNvbXBhcmlzb24gd2l0aCBgciBmc2MgJT4lIGZpbHRlcihqdWx5ICE9ICJqdWx5IikgJT4lIGRpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgbnJvdygpYCBpbiB0aGUgZmlyc3QgcXVhcnRlci4gVGhlc2UgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGNvcnJlc3BvbmRlZCB0byBhIHRvdGFsIG9mIGByIGZzYyAlPiUgIGRpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSBucm93KClgIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLiBUaGUgbGFyZ2VzdCByZXBvcnRpbmcgb3JnYW5pc2F0aW9uLCAyNjkwLCBoYWQgMjQgaW1wbGVtZW50aW5nIHBhcnRuZXJzLg0KDQpUaGUgaW50ZXJhY3RpdmUgcGxvdCBiZWxvdyBzaG93cyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyLg0KDQpgciBmc2MgJT4lIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiA1KSAlPiUgbnJvdygpYCBwYXJ0bmVycyAoMjElIG9mIHRoZSB0b3RhbCkgaGF2ZSBhIHByZXNlbmNlIGluIG1vcmUgdGhhbiA1IHRvd25zaGlwcy4gYHIgZnNjICU+JSBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSBmaWx0ZXIodG93bnNoaXBzID4gMTApICU+JSBucm93KClgIHBhcnRuZXJzICgxNiUgb2YgdGhlIHRvdGFsKSBhcmUgcHJlc2VudCBpbiBtb3JlIHRoYW4gMTAgdG93bnNoaXBzLg0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS1wYXJ0bmVyLXNjYXR0ZXJ9DQoNCiMgTWVkaWFuIHZhbHVlcyBhcmUgeCA9IDU2NzEgYW5kIHkgPSAzLiBDdXJyZW50bHkgdXNpbmcgbWVhbi4gDQpwYXJ0bmVyX3NjYXR0ZXIgPC0gZnNjICU+JSAgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShzdGF0ZXMgPSBuX2Rpc3RpbmN0KHN0YXRlKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IHRvd25zaGlwcywgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChpbXBsZW1lbnRpbmdfcGFydG5lciwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVzOiAiLCBzdGF0ZXMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvd25zaGlwczogIiwgdG93bnNoaXBzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpKSkpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQ4MTQ1LjMzLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNC41NTU1NTYsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcyksIGFscGhhID0gLjcpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2ciLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMTAwLCAzMDAsIDEwMDAsIDMwMDAsIDEwMDAwLCAzMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjUsIDUpKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIiwNCiAgICAgICB0aXRsZSA9ICJQbG90IG9mIGJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkLCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpnZ3Bsb3RseShwYXJ0bmVyX3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUNCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gDQogICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgdGV4dCA9DQogICAgICAgICAgICAgICBwYXN0ZTAoDQogICAgICAgICAgICAgICAgICJCZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICJtb3VzZSBvdmVyIGZvciBkZXRhaWxzOyBzaXplcyBpbmRpY2F0ZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQ7IHJlZCBsaW5lcyBhcmUgbWVhbnMiLA0KICAgICAgICAgICAgICAgICAiPC9zdXA+Ig0KICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICApKQ0KDQojIE1ha2UgYSBjb21wYXJpc29uIHdpdGggUTENCmBgYA0KDQoNCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBNb250aGx5IHByb2dyZXNzIGJ5IHBhcnRuZXINCg0KVGhlIHRoaWNrIGdyZXkgbGluZSBzaG93cyBhbiBvcmdhbmlzYXRpb24ncyBwcm9ncmVzcyBmcm9tIGxhc3QgeWVhciwgd2hpY2gsIGFzIG1lbnRpb25lZCwgY2Fubm90IGV4YWN0bHkgYmUgdXNlZCBmb3IgYSBzdHJhaWdodCBjb21wYXJpc29uIGFzIHRoZSBzY29wZSBvZiB0aGUgSFJQIGluIDIwMjEgd2FzIGRpZmZlcmVudCB1bnRpbCB0aGUgYXBwcm92YWwgb2YgdGhlIElFUlAsIGFkZGl0aW9uYWxseSwgbWFueSBwYXJ0bmVycyBvbmx5IGpvaW5lZCB0aGUgY2x1c3RlciBsYXRlIGluIDIwMjEgb3IgZXZlbiBpbiAyMDIyLiBTdGlsbCwgaXQgc2VydmVzIGFzIGEgcmVmZXJlbmNlLg0KDQoNCjxicj4NCg0KYGBge3IgcGFydG5lci1wcm9ncmVzcy1mYWNldC1saW5lfQ0KDQpwYXJ0bmVyX3RvcCA8LSBmc2MgJT4lIA0KICBzdW1fYmVuKGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gcmVvcmRlcihpbXBsZW1lbnRpbmdfcGFydG5lciwgLWJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHB1bGwoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgaGVhZCgxMikNCg0KbGluZV8yMDIxIDwtIGZzY18yMDIxICU+JSANCiAgcmVuYW1lKGltcGxlbWVudGluZ19wYXJ0bmVyID0gb3JnX2NvZGUpICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgZmlsdGVyKGltcGxlbWVudGluZ19wYXJ0bmVyICVpbiUgcGFydG5lcl90b3ApICU+JSANCiAgc2VsZWN0KGRhdGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBiZW5lZmljaWFyaWVzLCBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIG11dGF0ZShkYXRlID0gZGF0ZSArIHllYXJzKDEpKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkNCg0KZnNjICU+JQ0KICBmaWx0ZXIoaW1wbGVtZW50aW5nX3BhcnRuZXIgJWluJSBwYXJ0bmVyX3RvcCkgJT4lDQogIHNlbGVjdChkYXRlLCANCiAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVyLCANCiAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBuZXdfYmVuZWZpY2lhcmllcywgDQogICAgICAgICBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogICMgcmJpbmQoZnNjXzIwMjEgJT4lIA0KICAjICAgICAgICAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogICMgICAgICAgICBmaWx0ZXIob3JnX2NvZGUgJWluJSBwYXJ0bmVyX3RvcCkgJT4lIA0KICAjICAgICAgICAgc2VsZWN0KGRhdGUsIG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzLCBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4pKSArDQogIGdlb21fc3RlcChkYXRhID0gbGluZV8yMDIxLCANCiAgICAgICAgICAgIGFlcyh4ID0gZGF0ZSwgDQogICAgICAgICAgICAgICAgeSA9IGN1bV9iZW4pLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJncmV5IiwNCiAgICAgICAgICAgIHNpemUgPSAyLCANCiAgICAgICAgICAgIGFscGhhID0gLjQpICsgDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIA0KICAgICAgICAgICAgIGx0eSA9IDIsDQogICAgICAgICAgICAgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wNi0wMSIpKSwgDQogICAgICAgICAgICAgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJyZWQiLCANCiAgICAgICAgICAgICBsdHkgPSAyLCANCiAgICAgICAgICAgICB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTAzLTAxIikpLCANCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArDQogIGdlb21fc3RlcChzaXplID0gMC43KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIA0KICAgICAgICAgICAgICAgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gZmN0X3JldihmY3RfcmVvcmRlcihpbXBsZW1lbnRpbmdfcGFydG5lciwgY3VtX2JlbiwgbWF4KSksIA0KICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArICMgc2VlIGlmIHRoaXMgd29ya3Mgd2hlbiB5b3Uga25pdCwgdGhlbiBkbyBpdCBmb3IgdGhlIG90aGVyIHBsb3RzIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1vbnRobHkgcHJvZ3Jlc3Mgb2YgdG9wIDEyIGltcGxlbWVudGluZyBwYXJ0bmVycywgYXMgb2YgMzEgSnVseSAyMDIyIiwgDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBzaG93IGN1bXVsYXRpdmUgdW5pcXVlIGJlbmVmaWNpYXJpZXM7IHByZXZpb3VzIHllYXIncyBwcm9ncmVzcyBpbiBncmV5IikgDQoNCiMgZ2dzYXZlKCJwYXJ0bmVyX2ZhY2V0X2xpbmUucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDgsIHVuaXRzID0gImluIikgIA0KYGBgDQoNCjxicj4NCg0KVGhlIHRhYmxlIGJlbG93IGxpc3RzIHRoZSB0b3AgMTUgcGFydG5lcnMgYnkgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIyLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JQ0KICBncm91cF9ieShsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICBzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksIA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSU+JQ0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgaGVhZCgxNSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJUb3AgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYXMgb2YgMzEtMDctMjAyMiIpICU+JQ0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMyBEb25vcnMNCg0KVGhlIHRhYmxlIGJlbG93IHN1bW1hcmlzZXMgdGhlIHJlYWNoIGFuZCBzY29wZSAoaW4gdGVybXMgb2YgZ2VvZ3JhcGhpYyBleHRlbnQgYW5kIG51bWJlciBvZiBvcmdhbmlzYXRpb25zIHN1cHBvcnRlZCkgb2YgZG9ub3JzIHdobyBzdXBwb3J0IGF0IGxlYXN0IHR3byByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucy4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShyZXBvcnRfb3JncyA9IG5fZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbiksIA0KICAgICAgICAgICAgaW1wbGVtZW50aW5nX29yZ3MgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksIA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgDQogIGZpbHRlcighaXMubmEoZG9ub3IpICYgcmVwb3J0X29yZ3MgPiAxKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyZXBvcnRfb3JncykpICU+JQ0KICBoZWFkKDE1KSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIk9yZ2FuaXNhdGlvbnMgc3VwcG9ydGVkIGFuZCBnZW9ncmFwaGljIHJlYWNoIGJ5IGRvbm9yIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCANCiAgICAgICAgICAgaSA9IDEsIGogPSAxLCANCiAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoIk9ubHkgc2hvd2luZyBkb25vcnMgc3VwcG9ydGluZyBtb3JlIHRoYW4gb25lIHJlcG9ydGluZyBwYXJ0bmVyIikpDQoNCmBgYA0KDQo8YnI+DQoNClNhZ2FpbmcsIFNoYW4gKEVhc3QpLCBUYW5pbnRoYXJ5aSBhbmQgTWFnd2F5IGhhdmUgdGhlIGZld2VzdCBudW1iZXIgb2YgZG9ub3JzIHByZXNlbnQuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtZG9ub3Itc3RhdGVzfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGRvbm9ycyA9IG5fZGlzdGluY3QoZG9ub3IpLCANCiAgICAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhkb25vcnMpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIk51bWJlciBvZiBkb25vcnMgYnkgc3RhdGUiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgJT4lIA0KICB0aGVtZV96ZWJyYSgpDQoNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIGFzIHNob3duIGJ5IHRoZSB0YWJsZSBiZWxvdywgZXZlbiB0aG91Z2ggdGhlIG1ham9yaXR5IG9mIHBhcnRuZXJzIHJlcG9ydGVkIHRoZWlyIGRvbm9ycywgdGhlIG9taXNzaW9uIG9mIGRhdGEgZnJvbSB0aHJlZSBrZXkgcGFydG5lcnMgaGFzIHJlc3VsdGVkIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIHJlcG9ydGVkIGJlbmVmaWNpYXJpZXMgbm90IGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBhbnkgZG9ub3IuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtZG9ub3JzLWJlbmVmaWNpYXJpZXN9DQpmc2MgJT4lIA0KICBncm91cF9ieShkb25vcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGRvbm9yID0gaWZlbHNlKGlzLm5hKGRvbm9yKSwgIk5vIGRvbm9yIHNwZWNpZmllZCIsIGRvbm9yKSwgDQogICAgICAgICBkb25vciA9IGlmZWxzZShiZW5lZmljaWFyaWVzIDwgMTAwMCwgIk90aGVyIGRvbm9ycyIsIGRvbm9yKSkgJT4lIA0KICBncm91cF9ieShkb25vcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYCVfYmVuZWZpY2lhcmllc2ApKSAlPiUgDQogIGhlYWQoMTUpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiVG9wIGRvbm9ycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCANCiAgICAgICAgICAgaSA9IDEsIGogPSAxLCANCiAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoIkRvbm9ycyBzdGFydGluZyB3aXRoICdvcmdfeHh4eCcgYXJlIHBhcnRuZXJzIHVzaW5nIHRoZWlyIG93biBvcmdhbmlzYXRpb25hbCBmdW5kcyIpKQ0KIA0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuIEJlbmVmaWNpYXJpZXMNCg0KYHIgcm91bmQoKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IiAmIGp1bHkgPT0gImp1bHkiKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pIC8gKGZpbHRlcihmc2MsIGp1bHkgPT0gImp1bHkiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyBpbiBKdWx5IDIwMjIgd2VyZSBmcm9tIGhvc3Qgb3IgbG9jYWwgY29tbXVuaXRpZXMuIA0KDQo8YnI+PGJyPg0KDQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgc2VsZWN0KGJlbmVmaWNpYXJ5X3R5cGUsIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICB5ID0gZmN0X3Jlb3JkZXIoYmVuZWZpY2lhcnlfdHlwZSwgYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgIGZpbGwgPSBiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgICAgICBncm91cCA9IGJlbmVmaWNpYXJ5X3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoeSA9ICIiLCB4ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJCZW5lZmljYXJpZXMgcmVhY2hlZCBieSBiZW5lZmljaWFyeSB0eXBlIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyMgNS4xIEJlbmVmaWNpYXJ5IHR5cGVzDQoNCkluIEp1bHkgMjAyMiwgYHIgcm91bmQoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiICYganVseSA9PSAianVseSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyAoZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGJlbmVmaWNpYXJpZXMgd2VyZSBmcm9tIGhvc3Qgb3IgbG9jYWwgY29tbXVuaXRpZXMsIGluIGNvbXBhcmlzb24gdG8gYHIgcm91bmQoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgZm9yIHRoZSB3aG9sZSB5ZWFyLiBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIgJiBqdWx5ID09ICJqdWx5IikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIGZpbHRlcihmc2MsIGp1bHkgPT0gImp1bHkiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9ICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGJlbmVmaWNpYXJpZXMgaW4gSnVseSAyMDIyIHdlcmUgSURQcywgY29tcGFyZWQgdG8gYHIgcm91bmQoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSW50ZXJuYWxseSBEaXNwbGFjZWQiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgZm9yIHRoZSB3aG9sZSB5ZWFyLiANCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUsIGp1bHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgIGp1bHkgPSByZWNvZGUoanVseSwNCiAgICAgICAgICAgICAgICAgICAgICAgIm5vIiA9ICJqYW5fdG9fanVuIiwgDQogICAgICAgICAgICAgICAgICAgICAgInllcyIgPSAianVseSIgKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0ganVseSwgDQogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICBtdXRhdGUodG90YWwgPSBqYW5fdG9fanVuICsganVseSwgDQogICAgICAgICBwYyA9IHJvdW5kKHRvdGFsIC8gc3VtKHRvdGFsKSAqIDEwMCwgDQogICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX2p1bHkgPSByb3VuZChqdWx5IC8gc3VtKGp1bHkpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JSANCiAgZmlsdGVyKHRvdGFsICE9IDApICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBzZWxlY3QoYmVuZWZpY2lhcnlfdHlwZSwgDQogICAgICAgICBqYW5fdG9fanVuLCBqdWx5LCANCiAgICAgICAgIGAlX29mX2p1bHlgID0gcGNfanVseSwgDQogICAgICAgICB0b3RhbCwgDQogICAgICAgICBgJV9vZl90b3RhbGAgPSBwYykgJT4lIA0KICBhZG9ybl90b3RhbHMoInJvdyIpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihjYXB0aW9uID0gIlBlcnNvbnMgcmVhY2hlZCBieSBiZW5lZmljaWFyeSB0eXBlLCBhcyBvZiAzMSBKdWx5IDIwMjIiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkNCiAgDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyA2LiBDb21wYXJpc29uIHdpdGggdGFyZ2V0cw0KDQojIyMgNi4xIFJlYWNoZWQgdnMgdGFyZ2V0IGJ5IHRvd25zaGlwDQoNClRoZSBzcGVjaWZpY3Mgb2YgZWFjaCB0b3duc2hpcCBjYW4gYmUgcmV2aWV3ZWQgd2l0aCB0aGUgaW50ZXJhY3RpdmUgcGxvdCBiZWxvdy4gRWFjaCBwb2ludCBpcyBhIHRvd25zaGlwLCB3aXRoIHRoZSBzaXplIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzLiBUaGUgeC1heGlzIGluZGljYXRlcyB0aGUgdGFyZ2V0IHBvcHVsYXRpb24gYnkgdG93bnNoaXAgYW5kIHRoZSB5LWF4aXMgc2hvd3MgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIGFzIG9mIDMxIEp1bHkgMjAyMi4NCg0KVGhlIHJlZCBsaW5lIGRvd24gdGhlIG1pZGRsZSByZXByZXNlbnRzIHJlYWNoaW5nIDEwMCUgb2YgdGhlIHRhcmdldC4gVG93bnNoaXBzIGFib3ZlIHRoaXMgbGluZSBoYXZlIHJlYWNoZWQgbW9yZSBiZW5lZmljaWFyaWVzIHRoYW4gdGhlaXIgdGFyZ2V0IGFuZCB0b3duc2hpcHMgYmVsb3cgdGhlIGxpbmUgaGF2ZSBub3QgbWV0IHRoZWlyIHRhcmdldCB5ZXQuIFRoZSBmdXJ0aGVyIGF3YXkgYSB0b3duc2hpcCBpcyBmcm9tIHRoZSByZWQgbGluZSwgdGhlIGZ1cnRoZXIgYWJvdmUgb3IgYmVsb3cgaXRzIHRhcmdldCBpdCBpcy4gTW91c2Ugb3ZlciBlYWNoIG9mIHRoZSB0b3duc2hpcHMgdG8gc2VlIG1vcmUgZGV0YWlscy4NCg0KVGhlIDEzIHRvd25zaGlwcyBhbG9uZyB0aGUgZXh0cmVtZSBsZWZ0IHNpZGUgb2YgdGhlIHBsb3QgaGF2ZSBiZW5lZmljaWFyaWVzIGJ1dCBkbyBub3QgaGF2ZSB0YXJnZXRzICh0aGVpciB0YXJnZXRzIGhhdmUganVzdCBiZWVuIGNvZGVkIGFzIDEgc28gdGhhdCB0aGV5IHNob3cgdXAgb24gdGhlIHBsb3QpLiAxOTggdG93bnNoaXBzIHdpdGggdGFyZ2V0cyBoYXZlIG5vdCBiZWVuIHJlYWNoZWQuDQoNCmBgYHtyIGV2YWwgPSAgRkFMU0V9DQozMzAgLSAoZnNjICU+JSBkaXN0aW5jdChhZG1pbjNfcGNvZGUpICU+JSBucm93KCkpDQoNCg0KYGBgDQoNCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktdHNwLWNvbXBhcmlzb24tcmVhY2hlZC10YXJnZXR9DQoNCmJlbl90YXJnZXQgPC0gZnNjICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlID0gYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpKSAlPiUgDQogIGxlZnRfam9pbihwaW4sIGJ5ID0gYygiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgbXV0YXRlKHJlYWNoZWRfcGMgPSBiZW5lZmljaWFyaWVzIC8gZnNfdGFyZ2V0ZWQsDQogICAgICAgICByZWFjaGVkX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKHJlYWNoZWRfcGMpLCAxLCByZWFjaGVkX3BjKSwNCiAgICAgICAgIGZzX3RhcmdldGVkID0gaWZlbHNlKGZzX3RhcmdldGVkID09IDAgJiBiZW5lZmljaWFyaWVzID4gMCwgMSwgZnNfdGFyZ2V0ZWQpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlYWNoZWRfcGMpKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lICAgICAgICAgICANCiAgICAgICAgICAgICAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlID0gYWRtaW4zX3Bjb2RlX29sZCkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZSgNCiAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpDQogICAgICAgICAgICAgICkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShqdWx5ID0gMSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoanVseSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUoanVseSA9IGlmZWxzZShqdWx5ID09IDEsICJqdWx5IiwgImphbl90b19qdW4iKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoanVseSA9ICJqYW5fdG9fanVuIikpICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgDQogICAgICAgICBmc19waW4sIGZzX3RhcmdldGVkLCANCiAgICAgICAgIGJlbmVmaWNpYXJpZXMsIHJlYWNoZWRfcGMsIA0KICAgICAgICAgcGFydG5lcnMsIA0KICAgICAgICAganVseSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGZzX3RhcmdldGVkLCB5ID0gYmVuZWZpY2lhcmllcywgY29sb3VyID0ganVseSwgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDogIiwgY29tbWEoZnNfdGFyZ2V0ZWQsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiJSBvZiB0YXJnZXQ6ICIsIHBlcmNlbnQocmVhY2hlZF9wYywgYWNjdXJhY3kgPSAyKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnM6ICIsIHBhcnRuZXJzKSkpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IC41LCBzbG9wZSA9IDEsIGx0eSA9IDIsIGNvbG91ciA9ICJncmV5Iiwgc2l6ZSA9IC40KSArIA0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAtLjUsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gImdyZXkiLCBzaXplID0gLjQpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAwLjgpICsNCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjQUY3QUM1IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0YxQzQwRiIpKSArIA0KICBsYWJzKHggPSAiVGFyZ2V0ZWQgcG9wdWxhdGlvbiIsIHkgPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCB2cyB0YXJnZXRlZCBwb3B1bGF0aW9uIGJ5IHRvd25zaGlwLCBhcyAzMSBKdWx5IDIwMjIiLA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldCIsIA0KICAgICAgIGNvbG91ciA9ICIiKSArIA0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKQ0KDQpnZ3Bsb3RseShiZW5fdGFyZ2V0LCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gNTAwKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IA0KICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVuZWZpY2lhcmllcyB2cyB0YXJnZXQgYnkgdG93bnNoaXAsIGFzIG9mIDMxIEp1bHkgMjAyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldDsgc2l6ZSBzaG93cyBudW1iZXIgb2YgYmVuZWZpY2lhcmllczsgeWVsbG93IHRvd25zaGlwcyB3ZXJlIHJlYWNoZWQgaW4gSnVseSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICI8L3N1cD4iDQogICAgICAgICAgICAgICAgICAgICAgICApKSwNCiAgICAgICAgIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDcpKSkNCg0KYGBgDQoNCjxicj4NCg0KSW4gbW9zdCBvZiB0aGUgdG93bnNoaXBzIHdoZXJlIHRoZSBmb29kIHNlY3VyaXR5IGNsdXN0ZXIgaXMgcHJlc2VudCwgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaXMgdW5kZXIgdGhlIGNsdXN0ZXIgdGFyZ2V0LiBUb3duc2hpcHMgd2hpY2ggaGF2ZSBiZWVuIGhlYXZpbHkgb3ZlcnN1YnNjcmliZWQgaGF2ZSBiZWVuIGxpc3RlZCBpbiB0aGUgW3NlY29uZCBxdWFydGVyIDVXcyByZXBvcnRdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2ZzY181d3Nfc2Vjb25kX3F1YXJ0ZXJfMjAyMi8pLiANCg0KDQo8YnI+PGJyPg0KDQojIyMgNi4yIE1hcCBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gUTEgJiBRMiAyMDIyIHZzIHRhcmdldA0KDQpgYGB7ciBtYXBzLWJlbi10YXJnZXQsIGZpZy5oZWlnaHQ9MTR9DQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlID0gYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAwLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4zKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKw0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgaW4gSnVseSAyMDIyLCBieSB0b3duc2hpcCIsDQogICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQiLCANCiAgICAgICBmaWxsID0gIkJlbmVmaWNpYXJpZXMiKSArDQogIA0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlID0gYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAwLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJyksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArDQogIGxhYnModGl0bGUgPSAiQmVuZWZpY2lhcmllcyBUb3RhbCAyMDIyIGFzIG9mIDMxIEp1bHkgMjAyMiwgYnkgdG93bnNoaXAiLA0KICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGRvIG5vdCBoYXZlIGFueSBwYXJ0bmVycyBwcmVzZW50IiwgDQogICAgICAgZmlsbCA9ICJCZW5lZmljaWFyaWVzIikgKw0KcGluICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gZnNfdGFyZ2V0ZWQpLCBzaXplID0gLjEpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCB0cmFucyA9ICJsb2cxMCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IHJhbmdlKDU3LCA4MDE3NjApLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJyksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArDQogICAgbGFicyh0aXRsZSA9ICJUYXJnZXQgYnkgdG93bnNoaXAiLA0KICAgICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGZvb2Qgc2VjdXJpdHkgdGFyZ2V0cyIsIA0KICAgICAgICAgZmlsbCA9ICJ0YXJnZXQiKSArIA0KICANCnBpbiAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGZzX3BpbiksIHNpemUgPSAuMSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gcmFuZ2UoNTcsIDgwMTc2MCksIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgICBsYWJzKHRpdGxlID0gIlBlb3BsZSBpbiBOZWVkIGJ5IHRvd25zaGlwIiwNCiAgICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGRvIG5vdCBmb29kIHNlY3VyaXR5IHRhcmdldHMiLCANCiAgICAgICAgIGZpbGwgPSAiUElOIikNCiAgDQoNCiMgZ2dzYXZlKCJ0YXJnZXRfYnlfdHNwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTgsIHdpZHRoID0gMTEsIHVuaXRzID0gImluIikNCg0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDYuMyBJbnRlcmFjdGl2ZSByZWZlcmVuY2UgdGFibGUNCg0KSW4gdGhlIGludGVyYWN0aXZlIHRhYmxlIGJlbG93LCBpcyBhIGxpc3Qgb2YgdG93bnNoaXBzIHNvcnRlZCBieSB0aGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldGVkIHBvcHVsYXRpb24gYW5kIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIyLiBBbnkgb2YgdGhlIGNvbHVtbnMgY2FuIGJlIHNvcnQ7IHRoZSBzZWFyY2ggYmFycyBhYm92ZSBlYWNoIGNvbHVtbiBjYW4gYWxzbyBhc3Npc3QgaW4gZmlsdGVyaW5nLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBqdWx5X2JlbiA9IHN1bShuZXdfYmVuZWZpY2lhcmllc1tqdWx5ID09ICJqdWx5Il0pLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgcmlnaHRfam9pbihwaW4sIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwLCANCiAgICAgICAgICAgICAgICAgIGp1bHlfYmVuZWZpY2lhcmllcyA9IDApKSAlPiUNCiAgbXV0YXRlKHJlYWNoZWRfcGMgPSBiZW5lZmljaWFyaWVzIC8gZnNfdGFyZ2V0ZWQsDQogICAgICAgICByZWFjaGVkX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKHJlYWNoZWRfcGMpLCAxLCByZWFjaGVkX3BjKSwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSByb3VuZChyZWFjaGVkX3BjICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBmc190YXJnZXRlZCA9IHJvdW5kKGZzX3RhcmdldGVkLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICBnYXAgPSBmc190YXJnZXRlZCAtIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYXJyYW5nZShnYXApICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgdGFyZ2V0ID0gZnNfdGFyZ2V0ZWQsIGJlbmVmaWNpYXJpZXMsDQogICAgICAgICBqdWx5X2JlbiwgDQogICAgICAgICBnYXAsIGAlX3JlYWNoZWRgID0gcmVhY2hlZF9wYywgcGFydG5lcnMpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxNSwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOmJsYWNrOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgdGFibGUgLS0gdG93bnNoaXBzIikpICU+JSANCiAgZm9ybWF0Um91bmQoYygidGFyZ2V0IiwgImJlbmVmaWNpYXJpZXMiLCAiZ2FwIiksIGRpZ2l0cyA9IDApICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikNCg0KDQoNCmBgYA0KDQoNCg0KDQo=